#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
//内容不一样，地址一样
//不是内存，是进程地址空间

//每个进程都会存在一个进程地址空间，32[0,4GB];
//
//进程地址空间本质就是数据结构对象（操作系统对每个进程的进程地址空间进行管理）

//PCB管理
////链表连接
//struct 进程地址空间
//{
//    //进程空间属性
//    //struct 进程地址空间*next;
//}

int g_val = 100;
int main()
{
    int cnt = 0;
    pid_t id = fork();
    if(id==0)
    {
        //子进程
        while(1)
        {
            printf("child,pid :%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
            sleep(2);
            cnt++;
            if(cnt == 5)
            {
                g_val = 200;
                printf("child change g_val: 100->200\n");
            }
        }
    }
    else
    {
        while(1)
        {
            printf("father, pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
        }
    }
    return 0;
}




//int g_unval;
//int g_val = 100;
//
//int main(int argc, char *argv[], char *env[])
//{
//    printf("code addr: %p\n", main);
//    printf("init data addr: %p\n", &g_val);
//    printf("uninit data addr: %p\n", &g_unval);
//
//    char *heap = (char*)malloc(20);
//    char *heap1 = (char*)malloc(20);
//    char *heap2 = (char*)malloc(20);
//    char *heap3 = (char*)malloc(20);
//    static int c;
//    printf("heap addr: %p\n", heap);
//    printf("heap1 addr: %p\n", heap1);
//    printf("heap2 addr: %p\n", heap2);
//    printf("heap3 addr: %p\n", heap3);
//
//    printf("stack addr: %p\n", &heap);
//    printf("stack addr: %p\n", &heap1);
//    printf("stack addr: %p\n", &heap2);
//    printf("stack addr: %p\n", &heap3);
//    printf("c addr: %p, c: %d\n", &c, c);
//
//    for(int i = 0; argv[i]; i++)
//    {
//        printf("argv[%d]=%p\n", i, argv[i]); //?
//    }
//    for(int i = 0; env[i]; i++)
//    {
//        printf("env[%d]=%p\n", i, env[i]);
//    }
//
//    return 0;
//}
//////
////////int main()
////////{
////////    const char *myenv=getenv("hello");
////////    if(myenv==NULL) printf("getenv get null\n");
////////    else printf("myenv=%s\n", myenv);
////////
////////
////////   // extern char **environ;
////////   // // environ
//////   // for(int i = 0; environ[i]; i++)
//////   // {
//////   //     printf("environ[%d]: %s\n", i, environ[i]);
//////   // }
//////
//////    return 0;
//////}
